home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK2.toast / Development Kits (Disc 2) / QuickTime / Sample Code / QT QuickDraw 3D tracks / Code / VideoTexture / VideoTexture.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-26  |  4.8 KB  |  166 lines  |  [TEXT/CWIE]

  1. #include <Fonts.h>
  2. #include <Movies.h>
  3. #include <QD3D.h>
  4. #include <QD3DTransform.h>
  5.  
  6. OSErr addTextureEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, char *name);
  7.  
  8. void main(void)
  9. {
  10.     OSErr err = noErr;
  11.     OSType types;
  12.     StandardFileReply threeDeeReply, movieReply;
  13.     ThreeDeeDescriptionHandle sampleDescription = nil;
  14.     short fref;
  15.     AliasHandle alias = nil;
  16.     long eof;
  17.     Movie theMovie, inputMovie;
  18.     Track threeDeeTrack;
  19.     Media threeDeeMedia;
  20.     Track inputVideoTrack, outputVideoTrack;
  21.     FSSpec movieFSS;
  22.     short movieResRef;
  23.     short inputMovieResRef;
  24.     long textureReference;
  25.     QTAtomContainer inputMap;
  26.  
  27.     InitGraf(&qd.thePort);
  28.     InitFonts();
  29.     InitWindows();
  30.     InitMenus();
  31.     TEInit();
  32.     InitDialogs(0L);
  33.     InitCursor();
  34.     MaxApplZone();
  35.  
  36.     EnterMovies();
  37.  
  38.     // ask user for a 3D file
  39.     types = '3DMF';
  40.     StandardGetFilePreview(nil, 1, &types, &threeDeeReply);
  41.     if (!threeDeeReply.sfGood) return;
  42.  
  43.     // ask user for a movie file
  44.     types = 'MooV';
  45.     StandardGetFilePreview(nil, 1, &types, &movieReply);
  46.     if (!movieReply.sfGood) return;
  47.  
  48.     // figure out the size of the 3d file
  49.     FSpOpenDF(&threeDeeReply.sfFile, fsRdPerm, &fref);
  50.     GetEOF(fref, &eof);
  51.     FSClose(fref);
  52.  
  53.     // make an alias to the file (QuickTime term: data reference)
  54.     NewAliasMinimal(&threeDeeReply.sfFile, &alias);
  55.  
  56.     // make up a sample description for the 3d media
  57.     sampleDescription = (ThreeDeeDescriptionHandle)NewHandleClear(sizeof(ThreeDeeDescription));
  58.     if (err = MemError()) return;
  59.     (**sampleDescription).descSize = sizeof(ThreeDeeDescription);
  60.  
  61.     // create a movie file
  62.     FSMakeFSSpec(0, 0, "\pVideo Texture Movie File", &movieFSS);
  63.     err = CreateMovieFile(&movieFSS, 'TVOD', -1, createMovieFileDeleteCurFile, &movieResRef, &theMovie);
  64.     if (err) return;
  65.  
  66.     // get the movie from the movie file
  67.     err = OpenMovieFile(&movieReply.sfFile, &inputMovieResRef, fsRdPerm);
  68.     if (err) return;
  69.  
  70.     err = NewMovieFromFile(&inputMovie, inputMovieResRef, nil, nil, 0, nil);
  71.     if (err) return;
  72.  
  73.     CloseMovieFile(inputMovieResRef);
  74.  
  75.     // find the video track in the input movie
  76.     inputVideoTrack = GetMovieIndTrackType(inputMovie, 1, VideoMediaType, movieTrackMediaType | movieTrackEnabledOnly);
  77.     if (!inputVideoTrack) return;
  78.  
  79.     // copy the video track to the output movie
  80.     err = AddEmptyTrackToMovie(inputVideoTrack, theMovie, nil, 0, &outputVideoTrack);
  81.     if (err) return;
  82.  
  83.     err = InsertTrackSegment(inputVideoTrack, outputVideoTrack, 0, GetTrackDuration(inputVideoTrack), 0);
  84.     if (err) return;
  85.  
  86.     // toss input movie
  87.     DisposeMovie(inputMovie);
  88.  
  89.     // make up a 3d track, and media, very quickly
  90.     threeDeeTrack = NewMovieTrack(theMovie, 320 << 16, 240 << 16, 0);        // 320x240 pixels in size
  91.     threeDeeMedia = NewTrackMedia(threeDeeTrack, 'qd3d', GetMovieTimeScale(theMovie), (Handle)alias, rAliasType);        // make up a media that points to the 3dmf file
  92.  
  93.     // add the 3dmf file as a sample to the media (make it as long as the video track)
  94.     err = AddMediaSampleReference(threeDeeMedia, 0, eof, GetMovieDuration(theMovie), (SampleDescriptionHandle)sampleDescription,
  95.                 1, 0, nil);
  96.     if (err) return;
  97.  
  98.     // add the 3d media into the track
  99.     InsertMediaIntoTrack(threeDeeTrack, 0, 0, GetMediaDuration(threeDeeMedia), 1L << 16);
  100.  
  101.     // dispose unneeded things
  102.     DisposeHandle((Handle)alias);
  103.     DisposeHandle((Handle)sampleDescription);
  104.  
  105.     // create a reference to the video track from the 3d track
  106.     err = AddTrackReference(threeDeeTrack, outputVideoTrack, kTrackModifierReference, &textureReference);
  107.     if (err) return;
  108.  
  109.     // create an empty input map for the 3d track
  110.     err = QTNewAtomContainer(&inputMap);
  111.     if (err) return;
  112.  
  113.     err = addTextureEntryToInputMapEntry(inputMap, textureReference, "Joe");
  114.     if (err) return;
  115.  
  116.     // attach the input map to the 3d media handler
  117.     err = SetMediaInputMap(threeDeeMedia, inputMap);
  118.     if (err) return;
  119.  
  120.     // throw away the input map
  121.     QTDisposeAtomContainer(inputMap);
  122.  
  123.     // add the movie resource to the movie file
  124.     err = AddMovieResource(theMovie, movieResRef, nil, nil);
  125.     if (err) return;
  126.  
  127.     // close the movie file
  128.     CloseMovieFile(movieResRef);
  129.  
  130.     // toss that movie too (automatically tosses all tracks, media, etc).
  131.     DisposeMovie(theMovie);
  132. }
  133.  
  134. OSErr addTextureEntryToInputMapEntry(QTAtomContainer inputMap, long referenceIndex, char *name)
  135. {
  136.     OSErr err;
  137.     QTAtom inputAtom;
  138.     long inputType = kTrackModifierTypeSpriteImage;
  139.  
  140.     // add a input entry to the input mape
  141.     err = QTInsertChild(inputMap, kParentAtomIsContainer, kTrackModifierInput, referenceIndex,
  142.                 0, 0, nil, &inputAtom);
  143.     if (err) goto bail;
  144.  
  145.     // set the type of the modifier input
  146.     err = QTInsertChild(inputMap, inputAtom, kTrackModifierType, 1, 0, 
  147.                sizeof(inputType), &inputType, nil);
  148.     if (err) goto bail;
  149.  
  150.     // define the name
  151.     if (name) {
  152.         long nameLen = 1;
  153.         Ptr p = name;
  154.  
  155.         while (*p++)
  156.             nameLen++;
  157.  
  158.         err = QTInsertChild(inputMap, inputAtom, kTrackModifierInputName, 1, 0, 
  159.                  nameLen, name, nil);
  160.         if (err) goto bail;
  161.     }
  162.  
  163. bail:
  164.     return err;
  165. }
  166.